home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 4 / The 640 Meg Shareware Studio CD-ROM Volume IV (Data Express)(1994).ISO / clang / 131_01.zip / A8080.C next >
Text File  |  1993-06-05  |  7KB  |  253 lines

  1. /*
  2.     ************************************************************
  3.              ACRL 8080 Code Generator
  4.     ************************************************************
  5.  
  6.     W. Lemiszki                      9 Jan 1982
  7.  
  8.     Filename: a8080.c                 BDS C v1.50
  9. */
  10.  
  11. #include "acrl.h"
  12.  
  13. #define iZOP    1        /* MACHINE types */
  14. #define iREG    2
  15. #define iREGL    3
  16. #define iREGP    4
  17. #define iIMM    5
  18. #define iMVI    6
  19. #define iLXI    7
  20. #define iADR    8
  21. #define iMOV    9
  22. #define iXRP    10
  23.  
  24.  
  25. /*
  26.  *    Parse an 8080 instruction
  27.  *    -------------------------
  28.  */
  29. instruction()
  30. {
  31.     byte ty;
  32.     byte opcode;
  33.  
  34.     ty = type;                /* instruction type (above) */
  35.     opcode = value;                /* unmodified opcode */
  36.     scan();                    /* 1st operand token */
  37.  
  38.     switch (ty)
  39.         {
  40.         case (iZOP):            /* No operand instructions */
  41.         code(opcode);
  42.         break;
  43.  
  44.         case (iREG):            /* Register in bits 0-2 */
  45.         code(opcode + getreg(0));
  46.         break;
  47.  
  48.         case (iREGL):            /* Register in bits 3-5 */
  49.         code(opcode + getreg(1));
  50.         break;
  51.  
  52.         case (iREGP):            /* Register pair operand */
  53.         code(opcode + getreg(2));
  54.         break;
  55.  
  56.  
  57.  
  58.         case (iIMM):            /* 8 bit Immediate operand */
  59.         code(opcode);
  60.         code(expr8());
  61.         break;
  62.  
  63.         case (iMVI):            /* MVI instruction */
  64.         code(opcode + getreg(1));
  65.         eatcomma();
  66.         code(expr8());
  67.         break;
  68.  
  69.         case (iLXI):            /* LXI instruction */
  70.         code(opcode + getreg(2));
  71.         eatcomma();
  72.         codew(expr16());
  73.         break;
  74.  
  75.         case (iADR):            /* Address operand */
  76.         code(opcode);
  77.         codew(expr16());
  78.         break;
  79.  
  80.         case (iMOV):            /* MOV instruction */
  81.         opcode += getreg(1);
  82.         eatcomma();
  83.         code(opcode += getreg(0));
  84.         if (opcode == 0x76)            /* hlt */
  85.             error ('R');
  86.         break;
  87.  
  88.         case (iXRP):            /* LDAX or STAX instruction */
  89.         code(opcode + getreg(3));
  90.         break;
  91.         }
  92. }
  93.  
  94.  
  95.  
  96. /* Eat a comma */
  97. eatcomma()
  98. {
  99.     if (type != ',')
  100.         error('Q');
  101.     scan();                    /* and scan next token */
  102. }
  103.  
  104.  
  105.  
  106.  
  107. /*
  108.  *    Scan a register
  109.  *    ---------------
  110.  *    One of four actions based an arg:
  111.  *    0:  return reg in bits 0-2
  112.  *    1:  return reg in bits 3-5
  113.  *    2:  return even reg in bits 3-5       (b,d,h,sp)
  114.  *    3:  return b or d in bits 3-5
  115.  */
  116. byte getreg(arg)
  117. byte arg;
  118. {
  119.     byte reg;
  120.  
  121.     if ((reg = expr8()) >= 8)
  122.         error('R');
  123.  
  124.     switch (arg)
  125.         {
  126.         case 3:
  127.         if (reg & ~2)
  128.             error('R');
  129.         case 2:
  130.         if (reg & 1)
  131.             error('R');
  132.         case 1:
  133.         return (reg << 3);
  134.  
  135.         case 0:
  136.         return (reg);
  137.         }
  138. }
  139.  
  140.  
  141.  
  142.  
  143. /*
  144.  *    Define the Mnemonics
  145.  *    --------------------
  146.  */
  147. init8080()
  148. {
  149.     install(RESVD,    "XCHG",    MACHINE, iZOP,    0xEB);
  150.     install(RESVD,    "DAA",    MACHINE, iZOP,    0x27);
  151.     install(RESVD,    "CMA",    MACHINE, iZOP,    0x2F);
  152.     install(RESVD,    "STC",    MACHINE, iZOP,    0x37);
  153.     install(RESVD,    "CMC",    MACHINE, iZOP,    0x3F);
  154.     install(RESVD,    "RLC",    MACHINE, iZOP,    0x07);
  155.     install(RESVD,    "RRC",    MACHINE, iZOP,    0x0F);
  156.     install(RESVD,    "RAL",    MACHINE, iZOP,    0x17);
  157.     install(RESVD,    "RAR",    MACHINE, iZOP,    0x1F);
  158.     install(RESVD,    "RET",    MACHINE, iZOP,    0xC9);
  159.     install(RESVD,    "RNZ",    MACHINE, iZOP,    0xC0);
  160.     install(RESVD,    "RZ",    MACHINE, iZOP,    0xC8);
  161.     install(RESVD,    "RNC",    MACHINE, iZOP,    0xD0);
  162.     install(RESVD,    "RC",    MACHINE, iZOP,    0xD8);
  163.     install(RESVD,    "RPO",    MACHINE, iZOP,    0xE0);
  164.     install(RESVD,    "RPE",    MACHINE, iZOP,    0xE8);
  165.     install(RESVD,    "RP",    MACHINE, iZOP,    0xF0);
  166.     install(RESVD,    "RM",    MACHINE, iZOP,    0xF8);
  167.     install(RESVD,    "XTHL",    MACHINE, iZOP,    0xE3);
  168.     install(RESVD,    "SPHL",    MACHINE, iZOP,    0xF9);
  169.     install(RESVD,    "PCHL",    MACHINE, iZOP,    0xE9);
  170.     install(RESVD,    "EI",    MACHINE, iZOP,    0xFB);
  171.     install(RESVD,    "DI",    MACHINE, iZOP,    0xF3);
  172.     install(RESVD,    "NOP",    MACHINE, iZOP,    0x00);
  173.     install(RESVD,    "HLT",    MACHINE, iZOP,    0x76);
  174.     install(RESVD,    "RIM",    MACHINE, iZOP,    0x20);
  175.     install(RESVD,    "SIM",    MACHINE, iZOP,    0x30);
  176.  
  177.     install(RESVD,    "ADD",    MACHINE, iREG,    0x80);
  178.     install(RESVD,    "ADC",    MACHINE, iREG,    0x88);
  179.     install(RESVD,    "SUB",    MACHINE, iREG,    0x90);
  180.     install(RESVD,    "SBB",    MACHINE, iREG,    0x98);
  181.     install(RESVD,    "ANA",    MACHINE, iREG,    0xA0);
  182.     install(RESVD,    "XRA",    MACHINE, iREG,    0xA8);
  183.     install(RESVD,    "ORA",    MACHINE, iREG,    0xB0);
  184.     install(RESVD,    "CMP",    MACHINE, iREG,    0xB8);
  185.  
  186.     install(RESVD,    "INR",    MACHINE, iREGL,    0x04);
  187.     install(RESVD,    "DCR",    MACHINE, iREGL,    0x05);
  188.     install(RESVD,    "RST",    MACHINE, iREGL,    0xC7);
  189.  
  190.     install(RESVD,    "DAD",    MACHINE, iREGP,    0x09);
  191.     install(RESVD,    "INX",    MACHINE, iREGP,    0x03);
  192.     install(RESVD,    "DCX",    MACHINE, iREGP,    0x0B);
  193.     install(RESVD,    "PUSH",    MACHINE, iREGP,    0xC5);
  194.     install(RESVD,    "POP",    MACHINE, iREGP,    0xC1);
  195.  
  196.  
  197.     install(RESVD,    "ADI",    MACHINE, iIMM,    0xC6);
  198.     install(RESVD,    "ACI",    MACHINE, iIMM,    0xCE);
  199.     install(RESVD,    "SUI",    MACHINE, iIMM,    0xD6);
  200.     install(RESVD,    "SBI",    MACHINE, iIMM,    0xDE);
  201.     install(RESVD,    "ANI",    MACHINE, iIMM,    0xE6);
  202.     install(RESVD,    "XRI",    MACHINE, iIMM,    0xEE);
  203.     install(RESVD,    "ORI",    MACHINE, iIMM,    0xF6);
  204.     install(RESVD,    "CPI",    MACHINE, iIMM,    0xFE);
  205.     install(RESVD,    "IN",    MACHINE, iIMM,    0xDB);
  206.     install(RESVD,    "OUT",    MACHINE, iIMM,    0xD3);
  207.  
  208.     install(RESVD,    "MVI",    MACHINE, iMVI,    0x06);
  209.  
  210.     install(RESVD,    "LXI",    MACHINE, iLXI,    0x01);
  211.  
  212.     install(RESVD,    "JMP",    MACHINE, iADR,    0xC3);
  213.     install(RESVD,    "JNZ",    MACHINE, iADR,    0xC2);
  214.     install(RESVD,    "JZ",    MACHINE, iADR,    0xCA);
  215.     install(RESVD,    "JNC",    MACHINE, iADR,    0xD2);
  216.     install(RESVD,    "JC",    MACHINE, iADR,    0xDA);
  217.     install(RESVD,    "JPO",    MACHINE, iADR,    0xE2);
  218.     install(RESVD,    "JPE",    MACHINE, iADR,    0xEA);
  219.     install(RESVD,    "JP",    MACHINE, iADR,    0xF2);
  220.     install(RESVD,    "JM",    MACHINE, iADR,    0xFA);
  221.     install(RESVD,    "CALL",    MACHINE, iADR,    0xCD);
  222.     install(RESVD,    "CNZ",    MACHINE, iADR,    0xC4);
  223.     install(RESVD,    "CZ",    MACHINE, iADR,    0xCC);
  224.     install(RESVD,    "CNC",    MACHINE, iADR,    0xD4);
  225.     install(RESVD,    "CC",    MACHINE, iADR,    0xDC);
  226.     install(RESVD,    "CPO",    MACHINE, iADR,    0xE4);
  227.     install(RESVD,    "CPE",    MACHINE, iADR,    0xEC);
  228.     install(RESVD,    "CP",    MACHINE, iADR,    0xF4);
  229.     install(RESVD,    "CM",    MACHINE, iADR,    0xFC);
  230.     install(RESVD,    "LDA",    MACHINE, iADR,    0x3A);
  231.     install(RESVD,    "STA",    MACHINE, iADR,    0x32);
  232.     install(RESVD,    "LHLD",    MACHINE, iADR,    0x2A);
  233.     install(RESVD,    "SHLD",    MACHINE, iADR,    0x22);
  234.  
  235.     install(RESVD,    "MOV",    MACHINE, iMOV,    0x40);
  236.  
  237.     install(RESVD,    "LDAX",    MACHINE, iXRP,    0x0A);
  238.     install(RESVD,    "STAX",    MACHINE, iXRP,    0x02);
  239.  
  240.     install(RESVD,    "A",    IDENT,   idEQU,    7);
  241.     install(RESVD,    "B",    IDENT,   idEQU,    0);
  242.     install(RESVD,    "C",    IDENT,   idEQU,    1);
  243.     install(RESVD,    "D",    IDENT,   idEQU,    2);
  244.     install(RESVD,    "E",    IDENT,   idEQU,    3);
  245.     install(RESVD,    "H",    IDENT,   idEQU,    4);
  246.     install(RESVD,    "L",    IDENT,   idEQU,    5);
  247.     install(RESVD,    "M",    IDENT,   idEQU,    6);
  248.     install(RESVD,    "SP",    IDENT,   idEQU,    6);
  249.     install(RESVD,    "PSW",    IDENT,   idEQU,    6);
  250. }
  251.  
  252. /*EOF*/
  253.